package edu.pku.sei.mte.modification.command;

import edu.pku.sei.mte.mtemodel.metamodel.RTypeClass;
import edu.pku.sei.mte.mtemodel.model.MClass;
import edu.pku.sei.mte.mtemodel.model.MReference;

public class AddingNodeCommand extends ModelModificationCommand {

	private MClass newNode;
	
	public MClass getNewNode() {
		return newNode;
	}

	public void setNewNode(MClass newNode) {
		this.newNode = newNode;
	}

	@Override
	public void execute() throws Exception {
//		if(getEnv().isDeleted(pn,keyPairs,context)==false) {
//			c = createNode(pn);
//			v.setValue(c);
//			//model.addNode(c);
//			ModelModificationCommand.addNodeRequest(model, c, context);
//			env.setCreated(c);
//		} else {
//			CreateAfterDeleteException ex = new CreateAfterDeleteException();
//			ex.setContext(context);
//			ex.setModelObject(c);
//			
//			env.getController().catchSemanticException(ex);
//			if(ex.isCreate()){
//				c = createNode(pn);
//				v.setValue(c);
//				//model.addNode(c);
//				ModelModificationCommand.addNodeRequest(model, c, context);
//				env.setCreated(c);
//			}
//		}
		
		if(basicAddNode(newNode))
			commit();
		for(MClass c : newNode.getCompositeClass()){
			addNodeRequest(getModel(), c, getContext());
		}
		for(MReference mr : newNode.getEdges()){
			addEdgeRequest(getModel(), mr, getContext());
		}
	}

	@Override
	public void undo() {
		basicRemoveNode(newNode);
	}

	@Override
	public boolean isViolated() {
		boolean flag = false;
		for(RTypeClass type : getModel().getTypeGraph().getNodes()){
			if(type.equals(newNode.getType())){
				flag = true;
				break;
			}
		}
		if(!flag)
			return true;
		return super.isViolated();
	}
}
